package File_IO;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: DELL
 * Date: 2023-02-05
 * Time: 12:44
 */


// InputStream / OutputStream / Reader / Writer 都是抽象类 不能直接 new
// 抽象类和普通类差别不大 只不过抽象类带有抽象方法且不能 new,但抽象类可以有普通方法和普通属性
// 接口里面都是抽象方法 并且不能有普通成员(现在接口有default修饰得方法)
public class IODemo1 {
    public static void main(String[] args) throws IOException {
/*
        // 使用字节流读取文件
        InputStream inputStream = new FileInputStream("e:/test.txt");
        while(true) {
            int b = inputStream.read(); // 一次读取一个字节 用int表示特殊情况读完了 -- 返回 -1
            if(b == -1) {
                break; // 读取完毕
            }
            System.out.printf("%x \n",(byte)b); // 将读取到得b转为字节byte打印
*//*

        }
*/
        InputStream inputStream = new FileInputStream("e:/test.txt");

        while(true) {
            // read 得第二个版本, 需要用到提前准备好的一个数组
            byte[] buffer = new byte[1024];
            // read会尽可能地把参数传进来的数组填满,会尽可能得读取1024个字节填到数组buffer里
            // 但实际上, 文件剩余长度是有限得, 如果剩余长度超过1024,此时1024个字节都会填满.返回值就是1024了
            // 如果此时当前剩余长度不足1024,此时就有多少填多少, read方法就会返回当前实际长度

            int len = inputStream.read(buffer);
            // 这里的传参操作,相当于是把刚才准备好的数组,交给read方法,
            // 让read方法内部针对这个数组进行填写(此处参数相当于 "输出型参数"

            System.out.println("len: " + len);
            if(len == -1) {
                // 读完了 一个字节没有读取到 返回-1 代表文件读取结束
                break;
            }

            // 此时读取得结果就被放到了buffer数组中
            for(int i = 0; i < len; i++) {
                System.out.printf("%x\n", buffer[i]);
            }

            // 第二个版本比第一个版本 减小了冲击得次数
            // 比起第一次得一次读一个字节, 一次读取1024个字节循环次数降低了很多, read次数变少了
        }

        inputStream.close(); // 用完以后需要关闭文件

    }
}
